﻿using System.Collections.Generic;
using CTS.Com.Domain.Exceptions;
using CTS.Com.Domain.Helper;
using CTS.Com.Domain.Model;
using CTS.Data.Domain.Constants;
using CTS.W._150101.Models.Domain.Common.Dao;

namespace CTS.W._150101.Models.Domain.Common.Utils
{
    public class MasterDataCom
    {
        private readonly MasterDataComDao _comDao;
        public MasterDataCom() { _comDao = new MasterDataComDao(); }

        /// <summary>
        /// Kiểm tra tồn tại loại sản phẩm
        /// </summary>
        public bool IsExistItemType(string localeCd, string typeCd, bool ignoreDeleteFlag)
        {
            // trường hợp tham số là null
            if (DataCheckHelper.IsNull(localeCd)
                || DataCheckHelper.IsNull(typeCd)) {
                return true;
            }
            // Kết quả trả về
            return _comDao.IsExistItemType(localeCd, typeCd, ignoreDeleteFlag);
        }

        /// <summary>
        /// Lấy thông tin loại sản phẩm
        /// </summary>
        public MAItemType GetItemTypeInfo(string localeCd, string typeCd, bool ignoreDeleteFlag)
        {
            // trường hợp tham số là null
            if (DataCheckHelper.IsNull(localeCd)
                || DataCheckHelper.IsNull(typeCd)) {
                return null;
            }
            // Kết quả trả về
            return _comDao.GetItemTypeInfo(localeCd, typeCd, ignoreDeleteFlag);
        }

        /// <summary>
        /// Kiểm tra tồn tại chủng loại
        /// </summary>
        public bool IsExistCategory(string localeCd, string categoryCd, bool ignoreDeleteFlag)
        {
            // trường hợp tham số là null
            if (DataCheckHelper.IsNull(localeCd)
                || DataCheckHelper.IsNull(categoryCd)) {
                return true;
            }
            // Kết quả trả về
            return _comDao.IsExistCategory(localeCd, categoryCd, ignoreDeleteFlag);
        }

        /// <summary>
        /// Lấy thông tin chủng loại
        /// </summary>
        public MACategory GetCategoryInfo(string localeCd, string categoryCd, bool ignoreDeleteFlag)
        {
            // trường hợp tham số là null
            if (DataCheckHelper.IsNull(localeCd)
                || DataCheckHelper.IsNull(categoryCd)) {
                return null;
            }
            // Kết quả trả về
            return _comDao.GetCategoryInfo(localeCd, categoryCd, ignoreDeleteFlag);
        }

        /// <summary>
        /// Lấy danh sách chủng loại
        /// </summary>
        /// <param name="localeCd">Mã ngôn ngữ</param>
        /// <param name="skipCode">Skip code</param>
        /// <param name="nullValue">Thêm vào giá trị blank</param>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>Danh sách chủng loại</returns>
        public IList<KeyValueObject> GetListCboCategory(string localeCd, string skipCode, bool nullValue, bool ignoreDeleteFlag)
        {
            // Khởi tạo biến cục bộ
            var skipCodes = new string[0];
            var listResult = new List<KeyValueObject>();
            // Kết thúc lỗi trong trường hợp tham số là null
            if (DataCheckHelper.IsNull(localeCd)) {
                throw new ParamInvalidException();
            }
            // Lấy danh sách skip code trong trường hợp skip code khác null
            if (skipCode != null) {
                skipCodes = skipCode.Split(DataLogics.DELIMITER_SKIP_CODE);
            }
            // Thêm vào giá trị blank
            if (nullValue) {
                listResult.Add(KeyValueObject.Empty);
            }
            // Lấy danh sách
            var listData = _comDao.GetListCboCategory(localeCd, skipCodes, ignoreDeleteFlag);
            // Thêm danh sách code vào danh sách kết quả
            listResult.AddRange(listData);
            // Kết quả trả về
            return listResult;
        }

        /// <summary>
        /// Lấy danh sách loại sản phẩm
        /// </summary>
        /// <param name="localeCd">Mã ngôn ngữ</param>
        /// <param name="skipCode">Skip code</param>
        /// <param name="nullValue">Thêm vào giá trị blank</param>
        /// <param name="ignoreDeleteFlag">Bỏ qua cờ xóa</param>
        /// <returns>Danh sách loại sản phẩm</returns>
        public IList<KeyValueObject> GetListCboItemType(string localeCd, string skipCode, bool nullValue, bool ignoreDeleteFlag)
        {
            // Khởi tạo biến cục bộ
            var skipCodes = new string[0];
            var listResult = new List<KeyValueObject>();
            // Kết thúc lỗi trong trường hợp tham số là null
            if (DataCheckHelper.IsNull(localeCd)) {
                throw new ParamInvalidException();
            }
            // Lấy danh sách skip code trong trường hợp skip code khác null
            if (skipCode != null) {
                skipCodes = skipCode.Split(DataLogics.DELIMITER_SKIP_CODE);
            }
            // Thêm vào giá trị blank
            if (nullValue) {
                listResult.Add(KeyValueObject.Empty);
            }
            // Lấy danh sách
            var listData = _comDao.GetListCboItemType(localeCd, skipCodes, ignoreDeleteFlag);
            // Thêm danh sách code vào danh sách kết quả
            listResult.AddRange(listData);
            // Kết quả trả về
            return listResult;
        }

        /// <summary>
        /// Lấy danh sách mẫu sản phẩm
        /// </summary>
        /// <param name="nullValue">Thêm vào giá trị blank</param>
        /// <returns>Danh sách mẫu sản phẩm</returns>
        public IList<KeyValueObject> GetListCboExemplar(bool nullValue)
        {
            // Khởi tạo biến cục bộ
            var listResult = new List<KeyValueObject>();
            // Thêm vào giá trị blank
            if (nullValue) {
                listResult.Add(KeyValueObject.Empty);
            }
            // Lấy danh sách
            var listData = _comDao.GetListCboExemplar();
            // Thêm danh sách code vào danh sách kết quả
            listResult.AddRange(listData);
            // Kết quả trả về
            return listResult;
        }

        /// <summary>
        /// Lấy danh sách mẫu sản phẩm
        /// </summary>
        /// <param name="nullValue">Thêm vào giá trị blank</param>
        /// <returns>Danh sách mẫu sản phẩm</returns>
        public IList<string> GetListExemplarCd(bool nullValue)
        {
            // Khởi tạo biến cục bộ
            var listResult = new List<string>();
            // Thêm vào giá trị blank
            if (nullValue) {
                listResult.Add(string.Empty);
            }
            // Lấy danh sách
            var listData = _comDao.GetListExemplarCd();
            // Thêm danh sách code vào danh sách kết quả
            listResult.AddRange(listData);
            // Kết quả trả về
            return listResult;
        }
    }
}
